Cloudflare Workersを使って営業時間外はアクセスできないようにしたい

Cloudflare Workersを使って営業時間外はアクセスできないようにしたい

Clock Icon2024.08.27

前提

ALB + EC2 + RDS の一般的なWebアプリケーションの構成の社内アプリケーションがあります。

利用費をケチるため、アプリにアクセスできる時間を制限するため、以下のことをOpswitchを使って行っています

  • Auto Scaling グループでキャパを0にする
  • RDSを停止する

外形監視は常に行なっている状態。

困っていたこと

時間外だとEC2インスタンスが起動していないので、アプリケーションにはアクセスできませんが、ELB 5XXsがカウントされてしまっています。稼働率の計算に5XXsの数を使っていて、計算が面倒になって嫌だったのでA、時間外はLBにアクセスさせないようにする仕組みが欲しい。

対応した方法

Cloudflareを使っているので、Cloudflare Workersを利用して、時間帯に基づいてアクセスを制御をすることにしました。

Workersの無料プランでは、1日あたり10万件のリクエスト(Workersスクリプト全体、UTC+0)まで行けるので、社内アプリケーションにはじゅうぶんでした。

Cloudflare Workers

Cloudflare Workersは、強力なサーバーレスアプリケーションを構築できます

具体的には、Cloudflare Workersでリクエストを受け取り、時間外であればアクセスを制限し、特定のステータスコード(例えば503や403)を返すようにします。

手順1: Cloudflare Workersのセットアップ

  1. Cloudflareアカウントにログイン

    まず、Cloudflareにログインします

  2. ドメインを選択:

    Cloudflareのダッシュボードから、Workersを紐付けたいドメインを選択します。

  3. Workersの作成:

    選択したドメインの設定ページに移動し、「Workers」タブを選択します。
    「作成」や「ワーカーの作成」ボタンをクリックし、Workerを作成します。

  4. Workerのスクリプトを作成:
    Workersのエディタで、スクリプトを作成します。以下は例として、営業時間外のアクセスを制限するスクリプトです

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const now = new Date()
  const hour = (now.getUTCHours() + 9) % 24

  // 例: 営業時間を9:00〜17:00 JSTCに設定
  if (hour < 9 || hour >= 17) {
    return new Response('営業時間外のアクセスです(9:00〜17:00)。またのご来場をお待ちしております。', { status: 503 })
  }

  // 営業時間内の場合、リクエストを通常通り処理
  return fetch(request)
}

手順2: ルートハンドリングの設定

作成したWorkersのページに行き、設定タブをクリックします。
その後、「トリガー」ボタンをクリックします。

スクリーンショット 2024-08-27 11.22.51

「ルートを追加」ボタンをクリックします。

スクリーンショット 2024-08-27 11.24.26

「ルートを追加」ボタンをクリックすると保存できます。
表示されたフォームにルートを入力します。
たとえば、example.com/ と入力すると、example.com 以下のすべてのURLに対してWorkerが実行されます。

「ゾーン」に はワーカーを適用したいドメインを選択します。

スクリーンショット 2024-08-27 11.28.12

これで、指定したルートに対してCloudflare Workerが適用されるようになります。設定後は、そのルートにアクセスがあった場合にWorkerが自動的にトリガーされ、設定したスクリプトが実行されます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.